# Setting the path
setwd("C:/Users/lulut/Desktop/RRproject436819")
today <- Sys.Date()
year_ago <- as.Date(today - 365)
#Create a vector containing WIG20 company stocks, specifying the time range of the data, from last year to today this year
company_list <- c("ALR.WA", "ACP.WA", "PEO.WA", "CDR.WA", "CPS.WA", 
                  "DNP.WA", "GTN.WA", "JSW.WA", "KGH.WA", "KRU.WA", 
                  "LPP.WA", "MBK.WA", "OPL.WA", "PKO.WA", "PGE.WA", 
                  "PKN.WA", "SPL.WA", "TPE.WA", "PZU.WA", "CCC.WA")
#Load data from Yahoo Finance, and save it to an RDATA file
library(quantmod)
for (company in company_list) {
  assign(company, getSymbols(company, src = 'yahoo', from = year_ago, to = today, auto.assign = FALSE))
}      
save.image(file = "Data.RData")
print(ACP.WA)
library(dplyr)
library(corrplot)
library(ggplot2)
library(GGally)
library(xts)
library(MASS)
library(gridExtra)
```{r}
Error: attempt to use zero-length variable name
str(ALR.WA)
An xts object on 2023-06-12 / 2024-06-10 containing: 
  Data:    double [251, 6]
  Columns: ALR.WA.Open, ALR.WA.High, ALR.WA.Low, ALR.WA.Close, ALR.WA.Volume ... with 1 more column
  Index:   Date [251] (TZ: "UTC")
  xts Attributes:
    $ src    : chr "yahoo"
    $ updated: POSIXct[1:1], format: "2024-06-11 07:24:01"
#From the line chart, we can see that except for Cyfrowy Polsat and CD Project, the stock prices of other companies have been relatively stable since June 2023.

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoiRXJyb3I6IGF0dGVtcHQgdG8gdXNlIHplcm8tbGVuZ3RoIHZhcmlhYmxlIG5hbWVcbiJ9 -->

Error: attempt to use zero-length variable name




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZm9yKGkgaW4gMToyMCl7XG4gIHByaW50KGhlYWQoZXZhbChwYXJzZSh0ZXh0ID1jb21wYW55X2xpc3RbaV0pKSwgNSkpXG59XG5cbmBgYCJ9 -->

```r
for(i in 1:20){
  print(head(eval(parse(text =company_list[i])), 5))
}
            Open  High   Low Close Volume Adjusted MA10 MA20 MA30
2023-06-12 45.99 45.99 44.44 44.44 142929 42.50953   NA   NA   NA
2023-06-13 44.48 44.95 43.30 43.40 150186 41.51471   NA   NA   NA
2023-06-14 43.30 46.10 43.30 45.22 345980 43.25565   NA   NA   NA
2023-06-15 45.00 45.85 43.71 45.45 293856 43.47566   NA   NA   NA
2023-06-16 45.65 47.01 44.00 45.92 613946 43.92524   NA   NA   NA
           Open  High   Low Close Volume Adjusted MA10 MA20 MA30
2023-06-12 84.5 84.80 83.20 83.20  89477 79.73333   NA   NA   NA
2023-06-13 84.0 84.65 82.70 82.85  73472 79.39791   NA   NA   NA
2023-06-14 83.4 84.60 82.30 83.85  99587 80.35625   NA   NA   NA
2023-06-15 84.1 84.65 83.05 84.00 132609 80.50000   NA   NA   NA
2023-06-16 80.6 84.20 80.60 81.65 427038 81.65000   NA   NA   NA
             Open   High    Low  Close  Volume Adjusted MA10 MA20 MA30
2023-06-12 108.70 110.70 107.60 108.00  789495 92.31525   NA   NA   NA
2023-06-13 108.50 109.10 106.20 106.90  406602 91.37501   NA   NA   NA
2023-06-14 107.70 112.35 107.65 112.00 1055785 95.73433   NA   NA   NA
2023-06-15 111.70 112.45 109.05 112.05  768988 95.77708   NA   NA   NA
2023-06-16 112.05 114.20 111.10 112.10 1262988 95.81981   NA   NA   NA
             Open  High    Low  Close  Volume Adjusted MA10 MA20 MA30
2023-06-12 133.00 143.5 132.95 141.40 1584134   141.40   NA   NA   NA
2023-06-13 142.75 143.1 138.60 140.30  440282   140.30   NA   NA   NA
2023-06-14 140.45 160.0 140.30 159.00 1352766   159.00   NA   NA   NA
2023-06-15 159.90 168.4 155.25 168.25 1428362   168.25   NA   NA   NA
2023-06-16 168.25 173.0 159.80 170.00 1616168   170.00   NA   NA   NA
             Open   High    Low  Close  Volume Adjusted MA10 MA20 MA30
2023-06-12 16.515 16.765 16.260 16.390  402615   16.390   NA   NA   NA
2023-06-13 16.560 16.660 16.275 16.320  630782   16.320   NA   NA   NA
2023-06-14 16.360 17.210 16.360 17.035  631292   17.035   NA   NA   NA
2023-06-15 17.000 17.375 16.850 17.140  571303   17.140   NA   NA   NA
2023-06-16 17.100 17.645 16.880 17.045 2571753   17.045   NA   NA   NA
            Open  High   Low Close Volume Adjusted MA10 MA20 MA30
2023-06-12 460.4 473.2 460.4 469.9 332983    469.9   NA   NA   NA
2023-06-13 475.1 479.7 470.7 476.5 182186    476.5   NA   NA   NA
2023-06-14 477.7 478.3 470.2 473.5 208677    473.5   NA   NA   NA
2023-06-15 474.7 491.8 470.3 484.1 250572    484.1   NA   NA   NA
2023-06-16 485.0 491.2 474.1 477.1 515428    477.1   NA   NA   NA
             Open   High    Low  Close Volume  Adjusted MA10 MA20 MA30
2023-06-12 0.4165 0.4165 0.4110 0.4120 143559 0.2779759   NA   NA   NA
2023-06-13 0.4110 0.4150 0.4110 0.4150 138775 0.2800000   NA   NA   NA
2023-06-14 0.4110 0.4160 0.4105 0.4110 440792 0.2773012   NA   NA   NA
2023-06-15 0.4110 0.4200 0.4100 0.4195 120458 0.2830361   NA   NA   NA
2023-06-16 0.4135 0.4250 0.4120 0.4160 168188 0.2806747   NA   NA   NA
            Open  High   Low Close  Volume Adjusted MA10 MA20 MA30
2023-06-12 42.80 42.80 41.20 41.45  313567    41.45   NA   NA   NA
2023-06-13 41.95 42.66 40.91 42.06  422858    42.06   NA   NA   NA
2023-06-14 42.08 44.94 42.06 44.31  921100    44.31   NA   NA   NA
2023-06-15 44.70 44.84 43.91 44.36  423611    44.36   NA   NA   NA
2023-06-16 44.70 46.52 41.80 42.34 2078951    42.34   NA   NA   NA
            Open   High    Low  Close  Volume Adjusted MA10 MA20 MA30
2023-06-12 113.8 114.35 110.80 110.90  879699 109.9984   NA   NA   NA
2023-06-13 113.1 115.15 112.75 114.30  862881 113.3707   NA   NA   NA
2023-06-14 114.0 119.70 113.55 118.95 1493011 117.9829   NA   NA   NA
2023-06-15 118.2 120.85 117.45 120.75  763033 119.7683   NA   NA   NA
2023-06-16 121.0 122.55 119.50 120.70 1263656 119.7187   NA   NA   NA
            Open  High   Low Close Volume Adjusted MA10 MA20 MA30
2023-06-12 384.6 395.2 383.0 384.4  27303 355.7658   NA   NA   NA
2023-06-13 386.2 394.4 377.6 381.4  37594 352.9893   NA   NA   NA
2023-06-14 385.0 392.0 375.8 384.4  53683 355.7658   NA   NA   NA
2023-06-15 390.8 390.8 378.0 382.6  83963 354.0999   NA   NA   NA
2023-06-16 382.4 388.8 380.8 386.0 108703 357.2466   NA   NA   NA
            Open  High   Low Close Volume Adjusted MA10 MA20 MA30
2023-06-12 13790 14700 13610 14500   5760 13778.33   NA   NA   NA
2023-06-13 14570 14910 13900 13900   8376 13208.20   NA   NA   NA
2023-06-14 14200 14350 13850 14090   6901 13388.74   NA   NA   NA
2023-06-15 13800 14290 13500 14150   4742 13445.75   NA   NA   NA
2023-06-16 14290 14650 14150 14360   8705 13645.30   NA   NA   NA
            Open  High   Low Close Volume Adjusted MA10 MA20 MA30
2023-06-12 395.0 396.8 378.6 378.9  37959    378.9   NA   NA   NA
2023-06-13 378.9 384.0 371.9 375.8  41269    375.8   NA   NA   NA
2023-06-14 377.0 396.7 376.0 394.2  40751    394.2   NA   NA   NA
2023-06-15 390.0 397.1 376.2 396.4  77075    396.4   NA   NA   NA
2023-06-16 392.8 408.0 390.0 404.4 110849    404.4   NA   NA   NA
            Open  High   Low Close  Volume Adjusted MA10 MA20 MA30
2023-06-12 7.300 7.366 7.226 7.282 1616653 6.928995   NA   NA   NA
2023-06-13 7.372 7.380 7.120 7.134 1661326 6.788169   NA   NA   NA
2023-06-14 7.136 7.264 7.054 7.172 2001385 6.824327   NA   NA   NA
2023-06-15 7.200 7.286 7.110 7.246 1711985 6.894740   NA   NA   NA
2023-06-16 7.280 7.446 7.200 7.200 4889581 6.850969   NA   NA   NA
            Open  High   Low Close  Volume Adjusted MA10 MA20 MA30
2023-06-12 35.79 36.01 35.28 35.34 1863176 34.42837   NA   NA   NA
2023-06-13 35.40 35.65 34.73 34.95 1996685 34.04843   NA   NA   NA
2023-06-14 34.92 35.98 34.92 35.60 3663641 34.68166   NA   NA   NA
2023-06-15 35.20 35.67 34.21 35.67 3958683 34.74985   NA   NA   NA
2023-06-16 35.67 36.30 35.43 36.17 6950418 35.23695   NA   NA   NA
            Open  High   Low Close   Volume Adjusted MA10 MA20 MA30
2023-06-12 7.198 7.278 7.072 7.150  2739216    7.150   NA   NA   NA
2023-06-13 7.150 7.210 7.066 7.080  2317086    7.080   NA   NA   NA
2023-06-14 7.130 7.350 7.114 7.284  3122703    7.284   NA   NA   NA
2023-06-15 7.280 7.490 7.220 7.440  3420994    7.440   NA   NA   NA
2023-06-16 7.440 7.550 7.392 7.518 14891114    7.518   NA   NA   NA
            Open  High   Low Close  Volume Adjusted MA10 MA20 MA30
2023-06-12 65.30 65.48 63.70 63.94 2209624 58.88073   NA   NA   NA
2023-06-13 63.99 64.50 63.80 63.94 1591950 58.88073   NA   NA   NA
2023-06-14 64.00 65.63 64.00 64.96 2625791 59.82002   NA   NA   NA
2023-06-15 65.00 65.60 64.21 65.55 2530071 60.36334   NA   NA   NA
2023-06-16 65.59 67.00 65.36 66.82 6534021 61.53285   NA   NA   NA
            Open  High   Low Close Volume Adjusted MA10 MA20 MA30
2023-06-12 383.0 391.2 375.2 377.0  65668 330.7738   NA   NA   NA
2023-06-13 378.0 378.6 368.6 370.4  89113 324.9831   NA   NA   NA
2023-06-14 367.0 389.2 367.0 386.4  83546 339.0212   NA   NA   NA
2023-06-15 382.0 393.8 378.0 390.4  90574 342.5307   NA   NA   NA
2023-06-16 389.8 405.6 385.2 389.2 485822 341.4779   NA   NA   NA
            Open  High   Low Close  Volume Adjusted MA10 MA20 MA30
2023-06-12 2.414 2.429 2.390 2.390 1569167    2.390   NA   NA   NA
2023-06-13 2.400 2.405 2.342 2.354 2520116    2.354   NA   NA   NA
2023-06-14 2.351 2.426 2.351 2.419 2691713    2.419   NA   NA   NA
2023-06-15 2.408 2.490 2.360 2.480 3684935    2.480   NA   NA   NA
2023-06-16 2.486 2.542 2.461 2.487 5401818    2.487   NA   NA   NA
            Open  High   Low Close  Volume Adjusted MA10 MA20 MA30
2023-06-12 40.51 41.21 40.32 40.49  915579 38.14162   NA   NA   NA
2023-06-13 40.49 40.84 40.09 40.30 1551882 37.96264   NA   NA   NA
2023-06-14 40.30 41.18 40.30 40.71 1890022 38.34886   NA   NA   NA
2023-06-15 40.52 40.88 40.30 40.82 1377421 38.45248   NA   NA   NA
2023-06-16 40.77 41.42 40.66 41.09 4566586 38.70682   NA   NA   NA
            Open  High   Low Close Volume Adjusted MA10 MA20 MA30
2023-06-12 45.68 46.26 44.98 45.21  92317    45.21   NA   NA   NA
2023-06-13 45.27 45.96 44.90 45.75  47517    45.75   NA   NA   NA
2023-06-14 45.80 48.09 43.10 43.23 456163    43.23   NA   NA   NA
2023-06-15 43.19 44.08 42.21 42.94 247154    42.94   NA   NA   NA
2023-06-16 43.00 43.80 42.70 43.00 328555    43.00   NA   NA   NA

for (i in 1:length(company_list)) {   
  print(plot_graphic(eval(parse(text =company_list[i])), company_list[i]))
}

stock_returns <- list()
for(i in 1:20){
  stock_returns[[i]] <- eval(parse(text =company_list[i]))$`Daily Returns`
}
stock_returns <- do.call(cbind,stock_returns)
colnames(stock_returns) <- company_list
head(stock_returns)
                 ALR.WA       ACP.WA        PEO.WA       CDR.WA       CPS.WA       DNP.WA       GTN.WA       JSW.WA
2023-06-12           NA           NA            NA           NA           NA           NA           NA           NA
2023-06-13 -0.023402272 -0.004206756 -0.0101851703 -0.007779285 -0.004270878  0.014045555  0.007281510  0.014716540
2023-06-14  0.041935496  0.012070039  0.0477080299  0.133285791  0.043811285 -0.006295908 -0.009638498  0.053495005
2023-06-15  0.005086245  0.001788947  0.0004465221  0.058176101  0.006163754  0.022386497  0.020681304  0.001128396
2023-06-16  0.010340984  0.014285733  0.0004461635  0.010401189 -0.005542551 -0.014459822 -0.008343269 -0.045536529
2023-06-19  0.003266596  0.003061849 -0.0115967506 -0.024705864  0.006746833 -0.019283194  0.009615327 -0.026924879
                  KGH.WA       KRU.WA      LPP.WA       MBK.WA       OPL.WA       PKO.WA       PGE.WA       PKN.WA
2023-06-12            NA           NA          NA           NA           NA           NA           NA           NA
2023-06-13  0.0306582732 -0.007804261 -0.04137936 -0.008181594 -0.020324124 -0.011035668 -0.009790234  0.000000000
2023-06-14  0.0406823705  0.007865647  0.01366909  0.048962280  0.005326633  0.018597984  0.028813559  0.015952402
2023-06-15  0.0151324428 -0.004682471  0.00425833  0.005580877  0.010317887  0.001966213  0.021416823  0.009082573
2023-06-16 -0.0004141221  0.008886468  0.01484096  0.020181635 -0.006348363  0.014017398  0.010483880  0.019374506
2023-06-19 -0.0294117253 -0.008808195 -0.01949861 -0.018793289  0.001666675 -0.006911759 -0.001330171 -0.009278715
                 SPL.WA       TPE.WA       PZU.WA       CCC.WA
2023-06-12           NA           NA           NA           NA
2023-06-13 -0.017506649 -0.015062766 -0.004692558  0.011944281
2023-06-14  0.043196550  0.027612496  0.010173661 -0.055081977
2023-06-15  0.010351923  0.025217078  0.002702100 -0.006708326
2023-06-16 -0.003073669  0.002822568  0.006614427  0.001397331
2023-06-19 -0.011305372  0.040611207 -0.010221488 -0.010697653

#We can see that there is a positive correlation between some stocks

# Print mean income and covariance matrix
print(mean_income)
       ALR.WA        ACP.WA        PEO.WA        CDR.WA        CPS.WA        DNP.WA        GTN.WA        JSW.WA 
 3.315790e-03  3.498311e-04  2.282558e-03  8.899003e-05 -8.100618e-04 -4.560923e-04  2.600532e-03 -1.360533e-03 
       KGH.WA        KRU.WA        LPP.WA        MBK.WA        OPL.WA        PKO.WA        PGE.WA        PKN.WA 
 1.318866e-03  1.049862e-03  1.604105e-03  2.053065e-03  6.785544e-04  2.150445e-03  1.065876e-04  4.379165e-04 
       SPL.WA        TPE.WA        PZU.WA        CCC.WA 
 1.761037e-03  2.392414e-03  1.068477e-03  4.994033e-03 
print(cov_returns)
             ALR.WA       ACP.WA       PEO.WA       CDR.WA       CPS.WA       DNP.WA       GTN.WA       JSW.WA
ALR.WA 4.632698e-04 1.411086e-04 3.041012e-04 9.241539e-05 1.201875e-04 8.245376e-05 2.540982e-05 1.648018e-04
ACP.WA 1.411086e-04 2.418422e-04 1.082367e-04 1.252965e-04 1.108472e-04 6.917301e-05 7.888457e-05 9.554207e-05
PEO.WA 3.041012e-04 1.082367e-04 4.001193e-04 9.631651e-05 8.962659e-05 6.701975e-05 2.574160e-05 1.657594e-04
CDR.WA 9.241539e-05 1.252965e-04 9.631651e-05 6.121047e-04 2.320341e-04 7.760095e-05 1.094793e-04 1.948184e-04
CPS.WA 1.201875e-04 1.108472e-04 8.962659e-05 2.320341e-04 6.155807e-04 1.035353e-04 6.687939e-05 1.371149e-04
DNP.WA 8.245376e-05 6.917301e-05 6.701975e-05 7.760095e-05 1.035353e-04 4.473522e-04 7.552152e-05 8.504483e-05
GTN.WA 2.540982e-05 7.888457e-05 2.574160e-05 1.094793e-04 6.687939e-05 7.552152e-05 1.204979e-03 4.147485e-05
JSW.WA 1.648018e-04 9.554207e-05 1.657594e-04 1.948184e-04 1.371149e-04 8.504483e-05 4.147485e-05 7.648404e-04
KGH.WA 1.753666e-04 9.849887e-05 1.598623e-04 1.534280e-04 1.318505e-04 3.897797e-05 4.505593e-05 3.035341e-04
KRU.WA 1.647793e-04 1.066880e-04 1.325563e-04 1.032739e-04 1.379589e-04 5.515122e-05 2.698117e-05 1.378331e-04
LPP.WA 1.552109e-04 1.158146e-04 1.741807e-04 1.411455e-04 1.217266e-04 9.523469e-05 1.087515e-05 7.610874e-05
MBK.WA 3.292176e-04 1.125738e-04 3.036362e-04 8.391820e-05 1.281244e-04 8.824657e-05 6.584800e-05 1.459365e-04
OPL.WA 8.252421e-05 5.584169e-05 5.660668e-05 7.291580e-05 1.180599e-04 4.798228e-05 3.505205e-05 8.804304e-05
PKO.WA 2.648124e-04 1.037098e-04 3.246279e-04 7.510950e-05 7.823997e-05 7.889308e-05 5.856858e-06 1.407797e-04
PGE.WA 1.157891e-04 9.098111e-05 9.023323e-05 2.225008e-04 2.006513e-04 9.542836e-05 1.338857e-04 1.666727e-04
PKN.WA 1.099806e-04 4.109914e-05 1.311488e-04 1.279305e-04 1.007420e-04 6.200811e-05 4.744268e-05 1.809655e-04
SPL.WA 2.562611e-04 1.195819e-04 2.829829e-04 1.033288e-04 1.058718e-04 9.870189e-05 2.821516e-05 1.598231e-04
TPE.WA 9.980538e-05 7.617087e-05 6.322717e-05 1.764132e-04 1.474643e-04 7.723825e-05 7.392630e-05 1.369531e-04
PZU.WA 1.864738e-04 1.107291e-04 1.993709e-04 6.900362e-05 1.025080e-04 8.081504e-05 4.807977e-05 1.197507e-04
CCC.WA 7.584748e-05 6.556360e-05 9.726934e-05 9.659387e-05 1.917391e-04 1.040556e-04 8.527128e-05 3.301765e-05
             KGH.WA       KRU.WA       LPP.WA       MBK.WA       OPL.WA       PKO.WA       PGE.WA       PKN.WA
ALR.WA 1.753666e-04 1.647793e-04 1.552109e-04 3.292176e-04 8.252421e-05 2.648124e-04 1.157891e-04 1.099806e-04
ACP.WA 9.849887e-05 1.066880e-04 1.158146e-04 1.125738e-04 5.584169e-05 1.037098e-04 9.098111e-05 4.109914e-05
PEO.WA 1.598623e-04 1.325563e-04 1.741807e-04 3.036362e-04 5.660668e-05 3.246279e-04 9.023323e-05 1.311488e-04
CDR.WA 1.534280e-04 1.032739e-04 1.411455e-04 8.391820e-05 7.291580e-05 7.510950e-05 2.225008e-04 1.279305e-04
CPS.WA 1.318505e-04 1.379589e-04 1.217266e-04 1.281244e-04 1.180599e-04 7.823997e-05 2.006513e-04 1.007420e-04
DNP.WA 3.897797e-05 5.515122e-05 9.523469e-05 8.824657e-05 4.798228e-05 7.889308e-05 9.542836e-05 6.200811e-05
GTN.WA 4.505593e-05 2.698117e-05 1.087515e-05 6.584800e-05 3.505205e-05 5.856858e-06 1.338857e-04 4.744268e-05
JSW.WA 3.035341e-04 1.378331e-04 7.610874e-05 1.459365e-04 8.804304e-05 1.407797e-04 1.666727e-04 1.809655e-04
KGH.WA 4.724025e-04 1.271396e-04 9.673356e-05 1.473928e-04 4.824955e-05 1.485077e-04 1.354303e-04 1.766838e-04
KRU.WA 1.271396e-04 3.722808e-04 6.041307e-05 1.305119e-04 8.991068e-05 1.116951e-04 1.375645e-04 6.619190e-05
LPP.WA 9.673356e-05 6.041307e-05 1.200626e-03 1.762740e-04 6.325195e-05 1.840822e-04 1.077532e-04 9.433152e-05
MBK.WA 1.473928e-04 1.305119e-04 1.762740e-04 4.010354e-04 7.834343e-05 2.708113e-04 1.233500e-04 1.216228e-04
OPL.WA 4.824955e-05 8.991068e-05 6.325195e-05 7.834343e-05 1.556466e-04 5.895355e-05 8.123829e-05 4.933866e-05
PKO.WA 1.485077e-04 1.116951e-04 1.840822e-04 2.708113e-04 5.895355e-05 3.340412e-04 8.722519e-05 1.240856e-04
PGE.WA 1.354303e-04 1.375645e-04 1.077532e-04 1.233500e-04 8.123829e-05 8.722519e-05 6.067869e-04 1.489913e-04
PKN.WA 1.766838e-04 6.619190e-05 9.433152e-05 1.216228e-04 4.933866e-05 1.240856e-04 1.489913e-04 2.977928e-04
SPL.WA 1.543933e-04 1.145332e-04 1.691765e-04 2.761784e-04 6.374661e-05 2.611613e-04 1.186679e-04 1.103037e-04
TPE.WA 1.160442e-04 1.200565e-04 6.845224e-05 9.403145e-05 6.265987e-05 7.454977e-05 5.157245e-04 1.119402e-04
PZU.WA 1.300344e-04 1.141547e-04 1.432462e-04 1.794112e-04 6.466498e-05 1.800729e-04 9.044664e-05 1.039322e-04
CCC.WA 1.201510e-04 1.090483e-04 3.042967e-04 9.241360e-05 6.135382e-05 7.533782e-05 1.456842e-04 8.934893e-05
             SPL.WA       TPE.WA       PZU.WA       CCC.WA
ALR.WA 2.562611e-04 9.980538e-05 1.864738e-04 7.584748e-05
ACP.WA 1.195819e-04 7.617087e-05 1.107291e-04 6.556360e-05
PEO.WA 2.829829e-04 6.322717e-05 1.993709e-04 9.726934e-05
CDR.WA 1.033288e-04 1.764132e-04 6.900362e-05 9.659387e-05
CPS.WA 1.058718e-04 1.474643e-04 1.025080e-04 1.917391e-04
DNP.WA 9.870189e-05 7.723825e-05 8.081504e-05 1.040556e-04
GTN.WA 2.821516e-05 7.392630e-05 4.807977e-05 8.527128e-05
JSW.WA 1.598231e-04 1.369531e-04 1.197507e-04 3.301765e-05
KGH.WA 1.543933e-04 1.160442e-04 1.300344e-04 1.201510e-04
KRU.WA 1.145332e-04 1.200565e-04 1.141547e-04 1.090483e-04
LPP.WA 1.691765e-04 6.845224e-05 1.432462e-04 3.042967e-04
MBK.WA 2.761784e-04 9.403145e-05 1.794112e-04 9.241360e-05
OPL.WA 6.374661e-05 6.265987e-05 6.466498e-05 6.135382e-05
PKO.WA 2.611613e-04 7.454977e-05 1.800729e-04 7.533782e-05
PGE.WA 1.186679e-04 5.157245e-04 9.044664e-05 1.456842e-04
PKN.WA 1.103037e-04 1.119402e-04 1.039322e-04 8.934893e-05
SPL.WA 3.324200e-04 9.307663e-05 1.657195e-04 9.320786e-05
TPE.WA 9.307663e-05 7.919683e-04 7.646022e-05 1.602974e-04
PZU.WA 1.657195e-04 7.646022e-05 2.458722e-04 6.092239e-05
CCC.WA 9.320786e-05 1.602974e-04 6.092239e-05 9.976232e-04
```{r}
Error: attempt to use zero-length variable name

#Show the weights of each stock in best portfolio
best_port <- portfolio[MaxSharpRatio,]
for (i in 1:length(company_list)) {
  print(paste(company_list[i], ": ", best_port[i]))
}
[1] "ALR.WA :  0.135205560764959"
[1] "ACP.WA :  0.0770732023297311"
[1] "PEO.WA :  0.0294001971102957"
[1] "CDR.WA :  0.00826141606964576"
[1] "CPS.WA :  0.00941234701113828"
[1] "DNP.WA :  0.0113660008907634"
[1] "GTN.WA :  0.0686383252529199"
[1] "JSW.WA :  0.024027113403397"
[1] "KGH.WA :  0.0413148438023202"
[1] "KRU.WA :  0.0305522093428451"
[1] "LPP.WA :  0.00703220563722217"
[1] "MBK.WA :  0.054254912425709"
[1] "OPL.WA :  0.0342906330961425"
[1] "PKO.WA :  0.0738136107249253"
[1] "PGE.WA :  0.0211679835613602"
[1] "PKN.WA :  0.00496767427270371"
[1] "SPL.WA :  0.00399087231244983"
[1] "TPE.WA :  0.00617255656320359"
[1] "PZU.WA :  0.00284733701672747"
[1] "CCC.WA :  0.356210998411541"

for(j in 1:20){
  start_price <- tail(eval(parse(text =company_list[j]))$Adjusted,1)
  result <- monte_carlo(start_price, days, mu[company_list[j]], sigma[company_list[j]])
  sim[1] <- result[days]
  plot(result, type = "l", xlab = "Days", ylab = "Price", col = 1,main = paste0("Monte Carlo analysis for ", company_list[j]),ylim = c(0.88*start_price,1.12*start_price))
  for (i in 2:1000) {
  result <- monte_carlo(start_price, days, mu[company_list[j]], sigma[company_list[j]])
  sim[i] <- result[days]
  lines(result, col = i)
  }
  hist(sim, breaks = 100, main = "Histogram of Monte Carlo Simulations", xlab = "Price")
  text(0.6, 0.7, paste("Mean: ", mean(sim), "\nStd: ", sd(sim), "\nStart Price: ", start_price))
}

for(j in 1:20){
  start_price <- tail(eval(parse(text =company_list[j]))$Adjusted,1)
  result <- monte_carlo(start_price, days, mu[company_list[j]], sigma[company_list[j]])
  sim[1] <- result[days]
  plot(result, type = "l", xlab = "Days", ylab = "Price", col = 1,main = paste0("Monte Carlo analysis for ", company_list[j]),ylim = c(0.88*start_price,1.12*start_price))
  for (i in 2:1000) {
  result <- monte_carlo(start_price, days, mu[company_list[j]], sigma[company_list[j]])
  sim[i] <- result[days]
  lines(result, col = i)
  }
  hist(sim, breaks = 100, main = "Histogram of Monte Carlo Simulations", xlab = "Price")
  text(0.6, 0.7, paste("Mean: ", mean(sim), "\nStd: ", sd(sim), "\nStart Price: ", start_price))
}

LS0tDQp0aXRsZTogIlBvcnRmb2xpbyBvcHRpbWl6YXRpb24gb2YgV0lHMjAgc3RvY2tzIg0KYXV0aG9yOiAiSGFud2VuIE1pYW8gNDM2ODE5Ig0KZGF0ZTogIjIwMjQtMDYtMDgiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCmBgYHtyLGV2YWwgPSBGQUxTRX0NCiMgU2V0dGluZyB0aGUgcGF0aA0Kc2V0d2QoIkM6L1VzZXJzL2x1bHV0L0Rlc2t0b3AvUlJwcm9qZWN0NDM2ODE5IikNCnRvZGF5IDwtIFN5cy5EYXRlKCkNCnllYXJfYWdvIDwtIGFzLkRhdGUodG9kYXkgLSAzNjUpDQojQ3JlYXRlIGEgdmVjdG9yIGNvbnRhaW5pbmcgV0lHMjAgY29tcGFueSBzdG9ja3MsIHNwZWNpZnlpbmcgdGhlIHRpbWUgcmFuZ2Ugb2YgdGhlIGRhdGEsIGZyb20gbGFzdCB5ZWFyIHRvIHRvZGF5IHRoaXMgeWVhcg0KY29tcGFueV9saXN0IDwtIGMoIkFMUi5XQSIsICJBQ1AuV0EiLCAiUEVPLldBIiwgIkNEUi5XQSIsICJDUFMuV0EiLCANCiAgICAgICAgICAgICAgICAgICJETlAuV0EiLCAiR1ROLldBIiwgIkpTVy5XQSIsICJLR0guV0EiLCAiS1JVLldBIiwgDQogICAgICAgICAgICAgICAgICAiTFBQLldBIiwgIk1CSy5XQSIsICJPUEwuV0EiLCAiUEtPLldBIiwgIlBHRS5XQSIsIA0KICAgICAgICAgICAgICAgICAgIlBLTi5XQSIsICJTUEwuV0EiLCAiVFBFLldBIiwgIlBaVS5XQSIsICJDQ0MuV0EiKQ0KI0xvYWQgZGF0YSBmcm9tIFlhaG9vIEZpbmFuY2UsIGFuZCBzYXZlIGl0IHRvIGFuIFJEQVRBIGZpbGUNCmxpYnJhcnkocXVhbnRtb2QpDQpmb3IgKGNvbXBhbnkgaW4gY29tcGFueV9saXN0KSB7DQogIGFzc2lnbihjb21wYW55LCBnZXRTeW1ib2xzKGNvbXBhbnksIHNyYyA9ICd5YWhvbycsIGZyb20gPSB5ZWFyX2FnbywgdG8gPSB0b2RheSwgYXV0by5hc3NpZ24gPSBGQUxTRSkpDQp9ICAgICAgDQpzYXZlLmltYWdlKGZpbGUgPSAiRGF0YS5SRGF0YSIpDQpwcmludChBQ1AuV0EpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoR0dhbGx5KQ0KbGlicmFyeSh4dHMpDQpsaWJyYXJ5KE1BU1MpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmBgYA0KYGBge3J9DQojIyBDbGVhciBhbGwgb2JqZWN0cyBpbiB0aGUgY3VycmVudCB3b3JraW5nIGVudmlyb25tZW50IHNvIHRoYXQgd2hlbiBuZXcgZGF0YSBpcyBsb2FkZWQsIHRoZXJlIHdpbGwgYmUgbm8gaW50ZXJmZXJlbmNlIGZyb20gb2xkIGRhdGENCnJtKGxpc3QgPSBscygpKQ0KbG9hZCgiRGF0YS5SRGF0YSIpDQoNCmZvcihpIGluIDE6MjApew0KICBwcmludChoZWFkKGV2YWwocGFyc2UodGV4dCA9Y29tcGFueV9saXN0W2ldKSksIDUpKQ0KfQ0KYGBgDQoNCmBgYHtyfQ0Kc3RyKEFMUi5XQSkNCg0KI1VuaWZ5IHRoZSBjb2x1bW4gbmFtZXMgb2YgYWxsIGNvbXBhbnkgc3RvY2sgZGF0YSB0byBtYWtlIHN1YnNlcXVlbnQgZGF0YSBwcm9jZXNzaW5nIGFuZCBhbmFseXNpcyBtb3JlIGNvbnZlbmllbnQuIA0KZm9yKGkgaW4gMToyMCl7DQogIHRlbXAgPC0gZXZhbChwYXJzZSh0ZXh0ID1jb21wYW55X2xpc3RbaV0pKQ0KICBjb2xuYW1lcyh0ZW1wKSA9IGMoIk9wZW4iLCJIaWdoIiwiTG93IiwiQ2xvc2UiLCJWb2x1bWUiLCJBZGp1c3RlZCIpDQogIGFzc2lnbihjb21wYW55X2xpc3RbaV0sdGVtcCkNCn0NCnJtKHRlbXApDQpgYGANCg0KYGBge3IsaW5jbHVkZT1GQUxTRX0NClN5cy5zZXRsb2NhbGUgKCJMQ19USU1FIiwgIkVuZ2xpc2giKQ0KYGBgDQoNCmBgYHtyfQ0KI1ByaW50IHRoZSBBZGp1c3RlZCBDbG9zZSBQcmljZSBsaW5lIGNoYXJ0IGZvciBlYWNoIGNvbXBhbnkuIFRoZSBhZGp1c3RlZCBjbG9zaW5nIHByaWNlIHByb3ZpZGVzIGEgbW9yZSBhY2N1cmF0ZSBwcmljZSBoaXN0b3J5DQpmb3IoaSBpbiAxOmxlbmd0aChjb21wYW55X2xpc3QpKXsNCiAgcHJpbnQocGxvdChldmFsKHBhcnNlKHRleHQgPWNvbXBhbnlfbGlzdFtpXSkpJEFkanVzdGVkLCBtYWluID0gcGFzdGUwKGNvbXBhbnlfbGlzdFtpXSwiIEFkanVzdGVkIENsb3NlIFByaWNlIiksIHlsYWIgPSAiUHJpY2UiLCB4bGFiID0gIkRhdGUiLCB0eXBlID0gImwiLCBjb2wgPSAicmVkIikpDQp9DQojRnJvbSB0aGUgbGluZSBjaGFydCwgd2UgY2FuIHNlZSB0aGF0IGV4Y2VwdCBmb3IgQ3lmcm93eSBQb2xzYXQgYW5kIENEIFByb2plY3QsIHRoZSBzdG9jayBwcmljZXMgb2Ygb3RoZXIgY29tcGFuaWVzIGhhdmUgYmVlbiByZWxhdGl2ZWx5IHN0YWJsZSBzaW5jZSBKdW5lIDIwMjMuDQpgYGANCmBgYHtyfQ0KI0RlZmluZSBhIGxpc3QgTUFfZGF5cy4gVGhlIGF1dGhvciB1c2VkIHRocmVlIGRpZmZlcmVudCBtb3ZpbmcgYXZlcmFnZSBwZXJpb2RzIG9mIDEwLCAyMCBhbmQgMzAuIFRoZXNlIGFyZSB0aGUgY29tbW9ubHkgdXNlZCBtb3ZpbmcgYXZlcmFnZSBkYXlzLg0KTUFfZGF5cyA8LSBjKDEwLCAyMCwgMzApDQojU2luY2UgdGhlcmUgYXJlIGluc3VmZmljaWVudCB3aW5kb3dzLCBzbyBJIGZpbGwgaW4gTkEgdmFsdWUuDQoNCmZvcihpIGluIDE6MjApew0KICB0ZW1wID0gZXZhbChwYXJzZSh0ZXh0ID1jb21wYW55X2xpc3RbaV0pKQ0KICB0ZW1wJGBNQTEwYCA8LSByb2xsbWVhbih0ZW1wJEFkanVzdGVkLCBrID0gMTAsIGZpbGwgPSBOQSxhbGlnbiA9ICJyaWdodCIpDQogIHRlbXAkYE1BMjBgIDwtIHJvbGxtZWFuKHRlbXAkQWRqdXN0ZWQsIGsgPSAyMCwgZmlsbCA9IE5BLGFsaWduID0gInJpZ2h0IikNCiAgdGVtcCRgTUEzMGAgPC0gcm9sbG1lYW4odGVtcCRBZGp1c3RlZCwgayA9IDMwLCBmaWxsID0gTkEsYWxpZ24gPSAicmlnaHQiKQ0KICBhc3NpZ24oY29tcGFueV9saXN0W2ldLHRlbXApDQp9DQpybSh0ZW1wKQ0KDQpmb3IoaSBpbiAxOjIwKXsNCiAgcHJpbnQoaGVhZChldmFsKHBhcnNlKHRleHQgPWNvbXBhbnlfbGlzdFtpXSkpLCA1KSkNCn0NCmBgYA0KYGBge3J9DQojRGVmaW5lIGEgZnVuY3Rpb24gcGxvdF9ncmFwaGljIHRvIGRyYXcgY2hhcnRzLCBhbmQgZHJhdyB0aGUgc21vb3RoZWQgZGF0YSBvZiAyMCBjb21wYW5pZXMgKGNvbHVtbnMgNiB0byA5KQ0KcGxvdF9ncmFwaGljIDwtIGZ1bmN0aW9uKGNvbXBhbnksIGNvbXBhbnlfc3RyaW5nKSB7DQogIHBsb3QoY29tcGFueVssNjo5XSwgdHlwZSA9ICJsIiwgeGxhYiA9ICJEYXRlIiwgeWxhYiA9ICJQcmljZSIsIG1haW4gPSBjb21wYW55X3N0cmluZyxjb2wgPSAxOjQsbGVnZW5kLmxvYyA9ICJ0b3BsZWZ0IikNCn0NCg0KZm9yIChpIGluIDE6bGVuZ3RoKGNvbXBhbnlfbGlzdCkpIHsgICANCiAgcHJpbnQocGxvdF9ncmFwaGljKGV2YWwocGFyc2UodGV4dCA9Y29tcGFueV9saXN0W2ldKSksIGNvbXBhbnlfbGlzdFtpXSkpDQp9DQpgYGANCmBgYHtyfQ0KI0NhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSBvZiB0aGUgQWRqdXN0ZWQgY29sdW1uDQojVXNlIHRoZSBsaW5lcyBmdW5jdGlvbiB0byBhZGQgS2VybmVsIERlbnNpdHkgRXN0aW1hdGlvbiB0byBhbiBleGlzdGluZyBncmFwaA0KZm9yIChpIGluIDE6bGVuZ3RoKGNvbXBhbnlfbGlzdCkpew0KICB0ZW1wID0gZXZhbChwYXJzZSh0ZXh0ID1jb21wYW55X2xpc3RbaV0pKQ0KICB0ZW1wJGBEYWlseSBSZXR1cm5zYCA8LSBkaWZmKHRlbXAkQWRqdXN0ZWQpL3N0YXRzOjpsYWcodGVtcCRBZGp1c3RlZCwgayA9IDEpDQogIGFzc2lnbihjb21wYW55X2xpc3RbaV0sdGVtcCkNCiAgaGlzdChuYS5vbWl0KHRlbXAkYERhaWx5IFJldHVybnNgKSwgYnJlYWtzPTUwLCBjb2w9J2RvZGdlcmJsdWUnLCBtYWluPWNvbXBhbnlfbGlzdFtpXSwgeGxhYj0nRGFpbHkgUmV0dXJucycsIHlsYWI9J0NvdW50Jyx5bGltID0gYygwLDQwKSkNCiAgbGluZXMoZGVuc2l0eShuYS5vbWl0KHRlbXAkYERhaWx5IFJldHVybnNgKSksY29sID0gImJsdWUiLGx3ZCA9IDIpDQp9DQoNCmBgYA0KYGBge3J9DQojIENyZWF0ZSBkYXRhZnJhbWUgd2l0aCBzdG9jayByZXR1cm5zDQoNCg0Kc3RvY2tfcmV0dXJucyA8LSBsaXN0KCkNCmZvcihpIGluIDE6MjApew0KICBzdG9ja19yZXR1cm5zW1tpXV0gPC0gZXZhbChwYXJzZSh0ZXh0ID1jb21wYW55X2xpc3RbaV0pKSRgRGFpbHkgUmV0dXJuc2ANCn0NCnN0b2NrX3JldHVybnMgPC0gZG8uY2FsbChjYmluZCxzdG9ja19yZXR1cm5zKQ0KY29sbmFtZXMoc3RvY2tfcmV0dXJucykgPC0gY29tcGFueV9saXN0DQpoZWFkKHN0b2NrX3JldHVybnMpDQpgYGANCmBgYHtyLGZpZy5oZWlnaHQ9OCxmaWcud2lkdGg9OH0NCiMgUGxvdCBwYWlycGxvdA0KDQoNCmdncGFpcnMobmEub21pdChzdG9ja19yZXR1cm5zKSwgdGl0bGUgPSAiUGFpcnBsb3Qgb2YgU3RvY2sgUmV0dXJucyIpDQpgYGANCmBgYHtyLGZpZy5oZWlnaHQ9OCxmaWcud2lkdGg9OH0NCiMgQ2FsY3VsYXRlIHRoZSBjb3JyZWxhdGlvbiBtYXRyaXgNCiMgTkEgdmFsdWVzIHdpbGwgYmUgaWdub3JlZA0KY29yciA9IGNvcihzdG9ja19yZXR1cm5zLHVzZSA9ICJjb21wbGV0ZS5vYnMiKQ0KICANCiMgQ3JlYXRlIHRoZSBjb3JyZWxvZ3JhbQ0KY29ycnBsb3QoY29yciwgdHlwZSA9ICJsb3dlciIsIA0KICAgICAgICAgbWV0aG9kID0gInNoYWRlIiwgDQogICAgICAgICBhZGRDb2VmLmNvbCA9ICJibGFjayIsIA0KICAgICAgICAgdGwuY29sID0gImJsYWNrIiwgdGwuc3J0ID0gNDUpDQoNCmBgYA0KI1dlIGNhbiBzZWUgdGhhdCB0aGVyZSBpcyBhIHBvc2l0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gc29tZSBzdG9ja3MNCmBgYHtyLGZpZy5oZWlnaHQ9OCxmaWcud2lkdGg9OH0NCg0KIyBGdW5jdGlvbiB0byBjcmVhdGUgcGxvdHMNCmNyZWF0ZV9wbG90IDwtIGZ1bmN0aW9uKGRhdGEsIHhfbGFiZWwsIHlfbGFiZWwpIHsNCiAgZ2dwbG90KGRhdGEgPSBkYXRhLCBhZXMoeCA9IHgsIHkgPSB5KSkgKw0KICAgIGdlb21fcG9pbnQoKSArDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgY29sb3IgPSAiYmx1ZSIpICsNCiAgICBsYWJzKHggPSB4X2xhYmVsLCB5ID0geV9sYWJlbCkgKw0KICAgIHRoZW1lX21pbmltYWwoKQ0KfQ0KDQojIENyZWF0ZSBwbG90cw0KIyBnZXQgb25seSB0aGUgZmlyc3QgNSBzZXJpZXMNCmsgPC0gNQ0KcGxvdHMgPC0gbGlzdCgpDQojYXMuZGF0YS5mcmFtZSBlbnN1cmVzIHRoYXQgdGhlIG9iamVjdCBpcyBpbiBkYXRhIGZyYW1lIGZvcm1hdCAtICBkYXRhLmRyb3BuYSgpDQpzdG9ja19yZXR1cm4gPC0gYXMuZGF0YS5mcmFtZShuYS5vbWl0KHN0b2NrX3JldHVybnMpKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGNvbWJpbmF0aW9uIG9mIHN0b2Nrcw0KZm9yIChpIGluIDE6aykgew0KICBmb3IgKGogaW4gMTprKSB7DQogICAgIyBQbG90IGhpc3RvZ3JhbSBhbmQgZGVuc2l0eSBvbiBkaWFnb25hbA0KICAgICNEcmF3IGhpc3RvZ3JhbSBhbmQgZGVuc2l0eSBwbG90IG9uIHRoZSBkaWFnb25hbCwgZ2VvbV9oaXN0b2dyYW0gYW5kIGdlb21fZGVuc2l0eSBjb3JyZXNwb25kIHRvIHNucy5oaXN0cGxvdC4NCiAgICBpZiAoaSA9PSBqKSB7DQogICAgICBkYXRhIDwtIGRhdGEuZnJhbWUocmV0dXJucyA9IHN0b2NrX3JldHVyblssIGldKQ0KICAgICAgcGxvdHNbW2xlbmd0aChwbG90cykgKyAxXV0gPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gcmV0dXJucykpICsNCiAgICAgICAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDQwLCBmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKw0KICAgICAgICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUsIGNvbG9yID0gInJlZCIpICsNCiAgICAgICAgbGFicyh0aXRsZSA9IGNvbG5hbWVzKHN0b2NrX3JldHVybilbaV0sIHggPSAiUmV0dXJucyIsIHkgPSAiRnJlcXVlbmN5IikgKw0KICAgICAgICB0aGVtZV9taW5pbWFsKCkNCiAgICB9DQogICAgIyBQbG90IHNjYXR0ZXIgcGxvdCB3aXRoIHJlZ3Jlc3Npb24gbGluZSBvbiBsb3dlciB0cmlhbmdsZQ0KICAgIGlmIChpID4gaikgew0KICAgICAgZGF0YSA8LSBkYXRhLmZyYW1lKHggPSBzdG9ja19yZXR1cm5bLCBqXSwgeSA9IHN0b2NrX3JldHVyblssIGldKQ0KICAgICAgcGxvdHNbW2xlbmd0aChwbG90cykgKyAxXV0gPC0gY3JlYXRlX3Bsb3QoZGF0YSwgY29sbmFtZXMoc3RvY2tfcmV0dXJuKVtqXSwgY29sbmFtZXMoc3RvY2tfcmV0dXJucylbaV0pDQogICAgfQ0KICAgICMgUGxvdCBjb250b3VyIHBsb3Qgb24gdXBwZXIgdHJpYW5nbGUNCiAgICBpZiAoaSA8IGopIHsNCiAgICAgIGRhdGEgPC0gZGF0YS5mcmFtZSh4ID0gc3RvY2tfcmV0dXJuWywgal0sIHkgPSBzdG9ja19yZXR1cm5bLCBpXSkNCiAgICAgIHBsb3RzW1tsZW5ndGgocGxvdHMpICsgMV1dIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IHgsIHkgPSB5KSkgKw0KICAgICAgICBnZW9tX2RlbnNpdHlfMmQoKSArDQogICAgICAgIGxhYnModGl0bGUgPSBwYXN0ZShjb2xuYW1lcyhzdG9ja19yZXR1cm5zKVtpXSwgInZzIiwgY29sbmFtZXMoc3RvY2tfcmV0dXJucylbal0pLCB4ID0gY29sbmFtZXMoc3RvY2tfcmV0dXJucylbal0sIHkgPSBjb2xuYW1lcyhzdG9ja19yZXR1cm5zKVtpXSkgKw0KICAgICAgICB0aGVtZV9taW5pbWFsKCkNCiAgICB9DQogIH0NCn0NCg0KIyBBcnJhbmdlIHBsb3RzIGluIGEgZ3JpZA0KZ3JpZC5hcnJhbmdlKGdyb2JzID0gcGxvdHMsIG5jb2wgPSBrKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCiMgQ2FsY3VsYXRlIG1lYW4gaW5jb21lIGZvciBlYWNoIHN0b2NrDQpzdG9ja19yZXR1cm5zIDwtIG5hLm9taXQoc3RvY2tfcmV0dXJucykNCm1lYW5faW5jb21lIDwtIGFwcGx5KHN0b2NrX3JldHVybnMsIDIsIG1lYW4pDQoNCiMgQ2FsY3VsYXRlIGNvdmFyaWFuY2UgbWF0cml4IG9mIHJldHVybnMNCmNvdl9yZXR1cm5zIDwtIGNvdihzdG9ja19yZXR1cm5zKQ0KDQojIE51bWJlciBvZiBzdG9ja3MgY29ycmVzcG9uZHMgdG86IGNvdW50ID0gbGVuKHN0b2NrX3JldHVybnMuY29sdW1ucykNCmNvdW50IDwtIG5jb2woc3RvY2tfcmV0dXJucykNCg0KIyBQcmludCBtZWFuIGluY29tZSBhbmQgY292YXJpYW5jZSBtYXRyaXgNCnByaW50KG1lYW5faW5jb21lKQ0KcHJpbnQoY292X3JldHVybnMpDQpgYGANCg0KYGBge3J9DQojIEZ1bmN0aW9uIHRvIGdlbmVyYXRlIHJhbmRvbSBwb3J0Zm9saW8NCnJhbmRvbVBvcnRmb2xpbyA8LSBmdW5jdGlvbihpbnB1dCkgew0KICBzZXQuc2VlZChpbnB1dCkNCiAgc2hhcmUgPC0gZXhwKHJub3JtKGNvdW50KSkNCiAgc2hhcmUgPC0gc2hhcmUgLyBzdW0oc2hhcmUpDQogIHJldHVybihzaGFyZSkNCn0NCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgcG9ydGZvbGlvIGluY29tZSBDb3JyZXNwb25kcyB0byBucC5tYXRtdWwobWVhbl9pbmNvbWUudmFsdWVzLCBSYW5kKQ0KSW5jb21lUG9ydGZvbGlvIDwtIGZ1bmN0aW9uKFJhbmQpIHsNCiAgcmV0dXJuKHN1bShtZWFuX2luY29tZSAqIFJhbmQpKQ0KfQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBwb3J0Zm9saW8gcmlzayANClJpc2tQb3J0Zm9saW8gPC0gZnVuY3Rpb24oUmFuZCkgew0KICByZXR1cm4oc3FydCh0KFJhbmQpICUqJSBjb3ZfcmV0dXJucyAlKiUgUmFuZCkpDQp9DQojR2VuZXJhdGUgNTAsMDAwIHBvcnRmb2xpb3MNCmNvbWJpbmF0aW9ucyA8LSA1MDAwMA0KI0NvcnJlc3BvbmRpbmcgcmlzayA9IG5wLnplcm9zKGNvbWJpbmF0aW9ucykNCnJpc2sgPC0gcmVwKDAsIGNvbWJpbmF0aW9ucykNCmluY29tZSA8LSByZXAoMCwgY29tYmluYXRpb25zKQ0KcG9ydGZvbGlvIDwtIG1hdHJpeCgwLCBucm93ID0gY29tYmluYXRpb25zLCBuY29sID0gY291bnQpDQoNCiMgTG9vcCB0byBjcmVhdGUgbmV3IGNvbWJpbmF0aW9ucyBvZiBzaGFyZXMNCmZvciAoaSBpbiAxOmNvbWJpbmF0aW9ucykgew0KICByYW5kIDwtIHJhbmRvbVBvcnRmb2xpbyhpKQ0KICBwb3J0Zm9saW9baSwgXSA8LSByYW5kDQogIHJpc2tbaV0gPC0gUmlza1BvcnRmb2xpbyhyYW5kKQ0KICBpbmNvbWVbaV0gPC0gSW5jb21lUG9ydGZvbGlvKHJhbmQpDQp9DQoNCmBgYA0KDQpgYGB7cn0NCg0KIyBDb252ZXJ0IG51bXB5IGFycmF5cyB0byBSIHZlY3RvcnMvbWF0cmljZXMNCnJpc2sgPC0gcmlzayAqIDEwMA0KaW5jb21lIDwtIGluY29tZSAqIDEwMA0KDQojIEZpbmQgaW5kZXggb2YgbWF4aW11bSBTaGFycGUgcmF0aW8NCk1heFNoYXJwUmF0aW8gPC0gd2hpY2gubWF4KGluY29tZSAvIHJpc2spDQoNCiMgQ3JlYXRlIHNjYXR0ZXIgcGxvdA0Kc2NhdHRlcl9wbG90IDwtIGdncGxvdCgpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZGF0YS5mcmFtZShSaXNrID0gcmlzaywgSW5jb21lID0gaW5jb21lKSwgYWVzKHggPSBSaXNrLCB5ID0gSW5jb21lKSwgY29sb3IgPSAiYmx1ZSIsIHNoYXBlID0gMTYpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gZGF0YS5mcmFtZShSaXNrID0gcmlza1tNYXhTaGFycFJhdGlvXSwgSW5jb21lID0gaW5jb21lW01heFNoYXJwUmF0aW9dKSwgYWVzKHggPSBSaXNrLCB5ID0gSW5jb21lKSwgY29sb3IgPSAicmVkIiwgc2hhcGUgPSAxOSwgc2l6ZSA9IDMpICsNCiAgbGFicyh4ID0gIlJpc2siLCB5ID0gIkluY29tZSIsIHRpdGxlID0gIlBvcnRmb2xpb3MiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQojIFNob3cgdGhlIHBsb3QNCiNCbHVlIGRvdHMgcmVwcmVzZW50IGFsbCBnZW5lcmF0ZWQgcG9ydGZvbGlvcywgcmVkIGRvdHMgcmVwcmVzZW50IHRoZSBwb3J0Zm9saW8gd2l0aCB0aGUgbWF4aW11bSBTaGFycGUgcmF0aW8uDQpwcmludChzY2F0dGVyX3Bsb3QpDQpgYGANCg0KYGBge3J9DQojU2hvdyB0aGUgd2VpZ2h0cyBvZiBlYWNoIHN0b2NrIGluIGJlc3QgcG9ydGZvbGlvDQpiZXN0X3BvcnQgPC0gcG9ydGZvbGlvW01heFNoYXJwUmF0aW8sXQ0KZm9yIChpIGluIDE6bGVuZ3RoKGNvbXBhbnlfbGlzdCkpIHsNCiAgcHJpbnQocGFzdGUoY29tcGFueV9saXN0W2ldLCAiOiAiLCBiZXN0X3BvcnRbaV0pKQ0KfQ0KYGBgDQpgYGB7cn0NCiNQZXJmb3JtIE1vbnRlIENhcmxvIHNpbXVsYXRpb24gb24gc3RvY2tzIHRvIHByZWRpY3QgcG9zc2libGUgY2hhbmdlcyBpbiBzdG9jayBwcmljZXMgaW4gdGhlIG5leHQgeWVhciANCmRheXMgPC0gMzY1DQpkdCA8LSAxIC8gZGF5cw0KDQojbXU6IGF2ZXJhZ2UgcmV0dXJuIG9mIGVhY2ggc3RvY2sgDQptdSA8LSBhcHBseShzdG9ja19yZXR1cm5zLCAyLCBtZWFuKQ0Kc2lnbWEgPC0gYXBwbHkoc3RvY2tfcmV0dXJucywgMiwgc2QpDQoNCg0KbW9udGVfY2FybG8gPC0gZnVuY3Rpb24oc3RhcnRfcHJpY2UsIGRheXMsIG11LCBzaWdtYSkgew0KICBwcmljZSA8LSByZXAoMCwgZGF5cykNCiAgcHJpY2VbMV0gPC0gc3RhcnRfcHJpY2UNCiNzaG9jazogVGhlIHJhbmRvbSBjb21wb25lbnQgb2YgZGFpbHkgcHJpY2UgY2hhbmdlcy4NCiNkcmlmdDogVGhlIGRldGVybWluaXN0aWMgY29tcG9uZW50IG9mIGRhaWx5IHByaWNlIGNoYW5nZXMuICANCiAgc2hvY2sgPC0gcmVwKDAsIGRheXMpDQogIGRyaWZ0IDwtIHJlcCgwLCBkYXlzKQ0KICANCiAgZm9yICh4IGluIDI6ZGF5cykgew0KICAgIHNob2NrW3hdIDwtIHJub3JtKDEsIG1lYW4gPSBtdSAqIGR0LCBzZCA9IHNpZ21hICogc3FydChkdCkpDQogICAgZHJpZnRbeF0gPC0gbXUgKiBkdA0KICAgIA0KICAgIHByaWNlW3hdIDwtIHByaWNlW3ggLSAxXSArIChwcmljZVt4IC0gMV0gKiAoZHJpZnRbeF0gKyBzaG9ja1t4XSkpDQogIH0NCiAgDQogIHJldHVybihwcmljZSkNCn0NCg0Kc2ltIDwtIHJlcCgwLCAxMDAwKQ0KDQoNCmZvcihqIGluIDE6MjApew0KICBzdGFydF9wcmljZSA8LSB0YWlsKGV2YWwocGFyc2UodGV4dCA9Y29tcGFueV9saXN0W2pdKSkkQWRqdXN0ZWQsMSkNCiAgcmVzdWx0IDwtIG1vbnRlX2NhcmxvKHN0YXJ0X3ByaWNlLCBkYXlzLCBtdVtjb21wYW55X2xpc3Rbal1dLCBzaWdtYVtjb21wYW55X2xpc3Rbal1dKQ0KICBzaW1bMV0gPC0gcmVzdWx0W2RheXNdDQogIHBsb3QocmVzdWx0LCB0eXBlID0gImwiLCB4bGFiID0gIkRheXMiLCB5bGFiID0gIlByaWNlIiwgY29sID0gMSxtYWluID0gcGFzdGUwKCJNb250ZSBDYXJsbyBhbmFseXNpcyBmb3IgIiwgY29tcGFueV9saXN0W2pdKSx5bGltID0gYygwLjg4KnN0YXJ0X3ByaWNlLDEuMTIqc3RhcnRfcHJpY2UpKQ0KICBmb3IgKGkgaW4gMjoxMDAwKSB7DQogIHJlc3VsdCA8LSBtb250ZV9jYXJsbyhzdGFydF9wcmljZSwgZGF5cywgbXVbY29tcGFueV9saXN0W2pdXSwgc2lnbWFbY29tcGFueV9saXN0W2pdXSkNCiAgc2ltW2ldIDwtIHJlc3VsdFtkYXlzXQ0KICBsaW5lcyhyZXN1bHQsIGNvbCA9IGkpDQogIH0NCiAgaGlzdChzaW0sIGJyZWFrcyA9IDEwMCwgbWFpbiA9ICJIaXN0b2dyYW0gb2YgTW9udGUgQ2FybG8gU2ltdWxhdGlvbnMiLCB4bGFiID0gIlByaWNlIikNCiAgdGV4dCgwLjYsIDAuNywgcGFzdGUoIk1lYW46ICIsIG1lYW4oc2ltKSwgIlxuU3RkOiAiLCBzZChzaW0pLCAiXG5TdGFydCBQcmljZTogIiwgc3RhcnRfcHJpY2UpKQ0KfQ0KDQoNCmBgYA0K